package org.apli.haiam.admin.jsf.managed;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apache.commons.io.IOUtils;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.CexAgenda;
import org.apli.haiam.ejb.entidades.CexConsulta;
import org.apli.haiam.ejb.entidades.CexHistoriaClinica;
import org.apli.haiam.ejb.entidades.CexPreparacion;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexConsulta.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfDigitalizacion extends JsfBean<CexConsulta> {

    final Logger log = LoggerFactory.getLogger(JsfDigitalizacion.class);
    private int tipoBusqueda;
    private String parametroBusqueda;
    private CexHistoriaClinica hcHistoria;
    byte[] bytes;
    private String nombreArchivo;
    private String tipoArchivo;
    private CexPreparacion cexPreparacion;
    private CexAgenda cexAgenda;
    private UsuarioAdmin user;

    /**
     * Constructor por defecto.
     */
    public JsfDigitalizacion() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new CexConsulta();
        tipoBusqueda = 2;
        parametroBusqueda = "";
        hcHistoria = new CexHistoriaClinica();
        nombreArchivo = "";
        tipoArchivo = "";
        cexPreparacion = new CexPreparacion();
        cexAgenda = new CexAgenda();
        user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");

    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();

        if (object.getCcoId() == null) {

            try {
                if (hcHistoria.getChcId() != null) {
                    if (object.getCcoAnexo() != null) {
                        //Generar el turno
                        cexAgenda.setCagEstado(1);
                        cexAgenda.setCagFecha(object.getCcoFecha());
                        cexAgenda.setCagIdInstitucion(user.getUser().getAdmEmpleado().getAdmInstitucion().getIdInstitucion());
                        cexAgenda.setCagIdUsuario((int) user.getUser().getIdUsuario());
                        cexAgenda.setCagNombreInstitucion(user.getUser().getAdmEmpleado().getAdmInstitucion().getNombre());
                        cexAgenda.setCagNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                        cexAgenda.setCagTipo(0);
                        cexAgenda.setCexHistoriaClinica(hcHistoria);
                        //Grabar el turno
                        adminObject.crear(cexAgenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        //Generar la preparacion 
                        cexPreparacion.setCexAgenda(cexAgenda);
                        cexPreparacion.setCprEstado(1);
                        cexPreparacion.setCprFecha(object.getCcoFecha());
                        cexPreparacion.setCprIdUsuario((int) user.getUser().getIdUsuario());
                        cexPreparacion.setCprNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                        //Grabar la preparacion
                        adminObject.crear(cexPreparacion, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        //Generar la consulta
                        object.setCcoEstado(1);
                        object.setCcoHora(admin.getFechaDb());
                        object.setCcoIdUsuario((int) user.getUser().getIdUsuario());
                        object.setCcoNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                        object.setCexPreparacion(cexPreparacion);
                        //Grabar la consulta
                        admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        inicializar();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_FATAL, "Pdf campo obligatorio", "Agregue archivo pdf para poder grabar el registro"));
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_FATAL, "Paciente campo obligatorio", "Agregue un paciente para poder grabar la consulta"));
                }
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            try {
                //admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                //FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        }
        cargarLista();
        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            //lista = admin.listarOrdenada(object.getClass(), "cpaNombre", true);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public void listener(org.primefaces.event.FileUploadEvent event) throws Exception {
        try {
            bytes = IOUtils.toByteArray(event.getFile().getInputstream());
            nombreArchivo = event.getFile().getFileName();
            tipoArchivo = event.getFile().getContentType();
            object.setCcoAnexo(bytes);
        } catch (IOException e) {
            log.error("listener() {} ", e.getMessage());
        }
    }

    /**
     * Metodo que busca una historia clinica
     *
     *
     * @author David Carranza
     */
    public void buscarHc() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            hcHistoria = new CexHistoriaClinica();
            parametroBusqueda = parametroBusqueda.trim();
            if (parametroBusqueda.equals("")) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Valor nullo no permitido", "Ingrese parametro de busqueda"));

            } else {
                if (tipoBusqueda == 1) {
                    if (admin.existePorCampo(CexHistoriaClinica.class, "chcHistoriaClinica", parametroBusqueda, "chcEstado", 1)) {
                        hcHistoria = (CexHistoriaClinica) adminObject.buscar(CexHistoriaClinica.class, "chcHistoriaClinica", parametroBusqueda, "chcEstado", 1);
                        parametroBusqueda = "";
                    } else {
                        hcHistoria = new CexHistoriaClinica();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    }
                }

                if (tipoBusqueda == 2) {
                    if (admin.existePorCampo(CexHistoriaClinica.class, "chcCedula", parametroBusqueda, "chcEstado", 1)) {
                        hcHistoria = (CexHistoriaClinica) adminObject.buscar(CexHistoriaClinica.class, "chcCedula", parametroBusqueda, "chcEstado", 1);
                        parametroBusqueda = "";
                    } else {
                        hcHistoria = new CexHistoriaClinica();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    }
                } else if (tipoBusqueda == 3) {
                    if (admin.existePorCampo(CexHistoriaClinica.class, "chcPasaporte", parametroBusqueda, "chcEstado", 1)) {
                        hcHistoria = (CexHistoriaClinica) adminObject.buscar(CexHistoriaClinica.class, "chcPasaporte", parametroBusqueda, "chcEstado", 1);
                        parametroBusqueda = "";
                    } else {
                        hcHistoria = new CexHistoriaClinica();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    }
                }
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
            //List<CexParentesco> datosS = admin.listarOrdenada(object.getClass(), "cpaNombre", true);
            // datos = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad","espEstado",1, "espNombre", true);
            List<SelectItem> items = new ArrayList<>();
////            for (CexParentesco obj : datosS) {
////                items.add(new SelectItem(obj, obj.getCpaNombre()));
////            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    @Override
    public DataModel<CexConsulta> getDataModel() {
        return null;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public int getTipoBusqueda() {
        return tipoBusqueda;
    }

    public void setTipoBusqueda(int tipoBusqueda) {
        this.tipoBusqueda = tipoBusqueda;
    }

    public String getParametroBusqueda() {
        return parametroBusqueda;
    }

    public void setParametroBusqueda(String parametroBusqueda) {
        this.parametroBusqueda = parametroBusqueda;
    }

    public CexHistoriaClinica getHcHistoria() {
        return hcHistoria;
    }

    public void setHcHistoria(CexHistoriaClinica hcHistoria) {
        this.hcHistoria = hcHistoria;
    }

    public String getNombreArchivo() {
        return nombreArchivo;
    }

    public void setNombreArchivo(String nombreArchivo) {
        this.nombreArchivo = nombreArchivo;
    }

    public String getTipoArchivo() {
        return tipoArchivo;
    }

    public void setTipoArchivo(String tipoArchivo) {
        this.tipoArchivo = tipoArchivo;
    }

}
